//下一个排列
class Solution {
public:
    void nextPermutation(vector<int>& nums) 
    {
        int i=0;
        for(i=nums.size()-2;i>=0;i--)
        {
            if(nums[i]<nums[i+1])
            {
                //          i  i+1
                // 1 2 3 8  5   7  6  4
                break;
            }
        }
        if(i==-1) reverse(nums.begin(),nums.end());
         //在i到后面中 选一个最小的但是大于i+1的
        else
        {
            for(int j=nums.size()-1;j>i;j--)
            {
                if(nums[j]>nums[i])
                {
                    swap(nums[j],nums[i]);
                    //         i i+1  j
                    // 1 2 3 8 6  7   5  4
                    // 1 2 3 8 6 已经比 1 2 3 8 5 大了 后面的需要是最小的
                    reverse(nums.begin()+i+1,nums.end());
                    break;
                }
                
            }
        }

    }
};
//岛屿的周长
class Solution {
public:
    int direction[4][2] = {0, 1, 1, 0, -1, 0, 0, -1};
    int islandPerimeter(vector<vector<int>>& grid) {
        int result = 0;
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid[0].size(); j++) {
                if (grid[i][j] == 1) {
                    for (int k = 0; k < 4; k++) {       // 上下左右四个方向
                        int x = i + direction[k][0];
                        int y = j + direction[k][1];    // 计算周边坐标x,y
                        if (x < 0                       // i在边界上
                                || x >= grid.size()     // i在边界上
                                || y < 0                // j在边界上
                                || y >= grid[0].size()  // j在边界上
                                || grid[x][y] == 0) {   // x,y位置是水域
                            result++;
                        }
                    }
                }
            }
        }
        return result;
    }
};
